21.合并两个有序链表

Posted hzqshuai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21.合并两个有序链表相关的知识,希望对你有一定的参考价值。

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

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
      ListNode prevNode = new ListNode(-1);
      ListNode prev = prevNode;
      while(l1 != null && l2 != null){
          if(l1.val < l2.val){
              prevNode.next = l1;
              l1 = l1.next;
          }else{
              prevNode.next = l2;
              l2 = l2.next;
          }
          prevNode = prevNode.next;
      }
      prevNode.next = l1 == null ? l2 : l1;
      return prev.next;
}
}
 
 
思路:
  先创建一个虚拟头结点,再创建一个节点对象指向这个虚拟头结点,虚拟头结点所在的链表则是新的有序链表
当l1不为空且l2也不为空时{
 判断:
  如果l1的value小于l2的value
    让虚拟头结点的next指向l1,接着l1顺移指向l1.next
  其他情况下(即l1.value <= l2.value)
    让虚拟头结点的next指向l2,接着l2顺移指向l2.next
  做完上述任一操作后,让虚拟头结点顺移指向它的next                   
}                                           
为了能遍历完至少一个链表,应该给上述条件加一个循环的条件,让其循环执行
跳出上述循环的条件有三种
1.l1为空
2. l2为空
3. l1且l2都为空
因为l1和l2都为有序链表,所以在1和2的情况下,剩下的非空的链表中的剩余元素都比新有序链表的元素大,且都是有序的
所以直接把新有序链表的尾部接上剩下的非空的链表中的剩余元素
第三种情况,让其尾部指向null,因为都为空即l1和l2的元素数量相同且所有元素都已加入新的有序链表中了
最后返回指向这个虚拟头结点的节点对象的next,即新有序链表的头部

以上是关于21.合并两个有序链表的主要内容,如果未能解决你的问题,请参考以下文章

21. 合并两个有序链表

21_合并两个有序链表

[leetcode] 21. 合并两个有序链表

21-合并两个有序链表

21.合并两个有序链表

LeetCode Algorithm 21. 合并两个有序链表