21.合并两个有序链表

21.合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

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 均按 非递减顺序 排列

思路:两个链表,如果其中一个为空,返回另一个

  • 判断两个链表头节点谁的小,谁小就做头

  • 使用两个指针,curl1指向头小的链表(head)的下一个节点

  • curl2指向另外一条链表的头结点,pre作为结果的收集,先指向head

    21.合并两个有序链表_第2张图片

  • 当curl和cur2都不为null时判断两指针的大小,小的拼到pre的下一个节点上,并且指针向后移动一位

    21.合并两个有序链表_第3张图片

  • 当curl和cur2其中一个为null时,判断另一个链表的cur是不是为null,不为null直接pre拼上。

    21.合并两个有序链表_第4张图片

public class Problem_0021_MergeTwoSortedLists {
	public static ListNode mergeTwoLists(ListNode head1, ListNode head2) {
		if (head1 == null || head2 == null) {
			return head1 == null ? head2 : head1;
		}
		ListNode head = head1.val <= head2.val ? head1 : head2;
		ListNode cur1 = head.next;
		ListNode cur2 = head == head1 ? head2 : head1;
		ListNode pre = head;
		while (cur1 != null && cur2 != null) {
			if (cur1.val <= cur2.val) {
				pre.next = cur1;
				cur1 = cur1.next;
			} else {
				pre.next = cur2;
				cur2 = cur2.next;
			}
			pre = pre.next;
		}
		pre.next = cur1 != null ? cur1 : cur2;
		return head;
	}
}

你可能感兴趣的:(algorithm,链表,数据结构,算法)