合并两个有序单链表(Java)

思想:

准备两个链表l1和l2:

  1. 判断是否有链表为空:如果l1为空,则不用比较直接返回l2,如果l1为空,则直接返回l2;
  2. 比较l1和l2节点,选出最小的那个节点,将该节点设为合并后的链表的head(头)节点,同时将指向该节点的l1或l2后移,方便接下来的比较;
  3. 设置一个变量temp指向head节点,用于之后连接其它节点;
  4. 再比较l1和l2节点,同样选出小的那个节点,将该节点设为合并后的链表的第二个节点,用temp.next表示该节点,同时将指向该节点的l1或l2后移;
  5. 重复比较l1和l2节点,直到l1或l2节点为null;
  6. 此时,必定有一个链表中的所有节点都放入了新链表中,只要将另一个链表中的剩余的所有节点都接到新链表之后就可以了。

1.单链表的节点的结构:

public class ListNode {
     int val;//节点的属性,存储节点的值
     ListNode next;//节点的属性,存储了下一个节点的地址
     ListNode(int x) { val = x; }
 }

2.合并链表的方法:

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
       ListNode head = null;
       if (l1 == null) {
           return l2;
       }
       if (l2 == null) {
           return l1;
       }
       if (l1.val <= l2.val) {//如果l1节点的值小于等于l2节点的值,由于这两个链表是有序的,所以合并后最小的节点(head节点)就是它们两者中的小者
           head = l1;
           l1 = l1.next;//后移,用于继续比较选出接下来最小的节点
       }else {
           head = l2;
           l2 = l2.next;
       }
        ListNode temp = head;
       //接着比较两个链表,对两个链表中的最小的节点进行比较选出最小的,也就是合并后的第二小的节点,循环知道有一个链表为空
       while (l1 != null && l2 != null) {
           if (l1.val <= l2.val) {
              temp.next = l1;
               l1 = l1.next;
           }else {
               temp.next = l2;
               l2 = l2.next;
           }
           temp = temp.next;
       }
       if (l1 == null) {
           temp.next = l2;
       }
       if (l2 == null) {
           temp.next = l1;
       }
        return head;
    }

}

猜你喜欢

转载自blog.csdn.net/zm13007310400/article/details/78317821