1. 程式人生 > 資訊 >蘋果拿下 Apple Car 汽車專利:車身外部配備顯示屏,可向周圍車輛預警

蘋果拿下 Apple Car 汽車專利:車身外部配備顯示屏,可向周圍車輛預警

合併兩個有序連結串列


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
  • l1l2均按非遞減順序排列

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/merge-two-sorted-lists/
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。


思路解析:

  1. 判斷l1是否為空,空的話返回l2
  2. 判斷l2是否為空,空的話返回l1
  3. 此時需要判斷l1的第一個結點大於l2第一個結點還是l2第一個結點大於l1的第一個結點來劃分主鏈(結點小的作為主連結串列返回
    1. 1  當l1的第一個結點大於l2的第一個結點的時候
      1. 1.1 定義一個指向當前結點的指標指向l2的當前遍歷結點
      2. 1.2 定義一個指向頭節點的指標指向l2的頭結點
      3. 1.3 遍歷l1的結點、將結點依次按照有序插入到l2連結串列中

      2.1 當l1的第一個節點小於l2的第一個節點的時候與上面同理

public class test4 {

    public static
void 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 + "]"; } }

測試結果: