蘋果拿下 Apple Car 汽車專利:車身外部配備顯示屏,可向周圍車輛預警
阿新 • • 發佈:2021-08-31
合併兩個有序連結串列
21. 合併兩個有序連結串列
難度簡單 將兩個升序連結串列合併為一個新的升序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。示例 1:
輸入:l1 = [1,2,4], l2 = [1,3,4] 輸出:[1,1,2,3,4,4]
示例 2:
輸入:l1 = [], l2 = [] 輸出:[]
示例 3:
輸入:l1 = [], l2 = [0] 輸出:[0]
提示:
- 兩個連結串列的節點數目範圍是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按非遞減順序排列
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/merge-two-sorted-lists/
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
思路解析:
- 判斷l1是否為空,空的話返回l2
- 判斷l2是否為空,空的話返回l1
- 此時需要判斷l1的第一個結點大於l2第一個結點還是l2第一個結點大於l1的第一個結點來劃分主鏈(結點小的作為主連結串列返回)
- 1 當l1的第一個結點大於l2的第一個結點的時候
- 1.1 定義一個指向當前結點的指標指向l2的當前遍歷結點
- 1.2 定義一個指向頭節點的指標指向l2的頭結點
- 1.3 遍歷l1的結點、將結點依次按照有序插入到l2連結串列中
- 1 當l1的第一個結點大於l2的第一個結點的時候
2.1 當l1的第一個節點小於l2的第一個節點的時候與上面同理
public class test4 { public staticvoid main(String[] args) { // TODO Auto-generated method stub ListNode l1 = new ListNode(); l1.val = 1; // l1.next = new ListNode(2); // l1.next.next = new ListNode(4); ListNode l2 = new ListNode(); l2.val = 2; // l2.next = new ListNode(3); // l2.next.next = new ListNode(4);System.out.println(new test4().mergeTwoLists(l1, l2)); System.out.println("111"); } ListNode head; // public void public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1==null) { return l2; } if(l2==null) { return l1; } //將l1合併到l2中 // //遍歷l1 if(l1.val>=l2.val) { //定義一個指標指向l2 ListNode cur = l2; //定義頭節點 ListNode head = l2; while(l1!=null) { while(l2!=null) { //判斷l1與當前節點的大小 if(cur.next!=null) {
//此處判斷的時候需要判斷l1當前節點是否大於當前遍歷l2結點的基礎上還需要判斷下一個結點是否大於當前結點,否則當前結點後移
if(l1.val>=cur.val&&l1.val<cur.next.val)
{
ListNode newNode = new ListNode(l1.val);
newNode.next = cur.next; cur.next = newNode;
//如果當前節點小於l1結點的時候理應把指標後移
l2 = l2.next;
//上一個節點
cur = l2;
break;
}
}else if(l1.val>=cur.val) {
ListNode newNode = new ListNode(l1.val);
newNode.next = cur.next;
cur.next = newNode;
l2 = l2.next;
//上一個節點 cur = l2; break; }
l2 = l2.next; cur = cur.next; }
l1 = l1.next; }
return head; }
else { //定義一個指標指向l2 ListNode cur = l1;
//定義頭節點 ListNode head = l1;
while(l2!=null) {
while(l1!=null) {
//判斷l1與當前節點的大小
if(cur.next!=null) {
if(l2.val>=cur.val&&l2.val<cur.next.val) { ListNode newNode = new ListNode(l2.val); newNode.next = cur.next; cur.next = newNode; //如果當前節點小於l1結點的時候理應把指標後移 l1 = l1.next; //上一個節點 cur = l1; break; } }else if(l2.val>=cur.val) { ListNode newNode = new ListNode(l2.val); newNode.next = cur.next; cur.next = newNode; l1 = l1.next; //上一個節點 cur = l1; break; } l1 = l1.next; cur = cur.next; } l2 = l2.next; } return head; } } } class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; } @Override public String toString() { return "ListNode [val=" + val + ", next=" + next + "]"; } }
測試結果: