[LeetCode21-链表-简单] 合并2个有序列表

这个题目是这样的,就是说有两个链表,这两个链表按照非递减的顺序排列, 我们要把这两个升序的链表合并,返回一个新的升序链表,新链表要求拼接给定的2个链表的所有结点,也就是说如果有重复的结点,也要全部返回列在新链表中

1->2->4

1->3->5      =》 返回的是  1->1->2->3->4->5   

首先,拿到这个题目,你会怎么想,我们假设第1个链表是ListNode1, 第2个链表是ListNode2,  返回的结果链表是ListNodeResult  那么我们接下来是怎么操作呢:

1. ListNode1的第1个结点 和 ListNode2的第1个结点比较,哪个小,我们就把这个小的作为结果链表ListNodeResult的第1个结点, 然后剩下的ListNode1 和 ListNode2进行同样的比较

       If(ListNode1.val <= ListNode2.val)     ListNode1 = ListNode1.next     =>  ListNode1 和 ListNode2继续进行同样的比较

       If(ListNode2.val <= ListNode2.val)   ListNode2 = ListNode2.next  => ListNode1 和 ListNode2继续进行同样的比较     

看到上面的“同样的比较”, 我们能想到什么?? =》 递归  对不对 ?  =》 所以这道题目,显然可以通过递归来进行  =》  我们来写代码

在写代码时,我不自觉的写成了迭代的方法,看来迭代还是更符合我常规的代码思路,请看下面

 

 

   public class ListNode
    {
        public int val;
        public ListNode next;
        public ListNode(int x = 0, ListNode nextNode = null)
        {
            val = x;
            next = nextNode;
        }
        
    }
 public ListNode CombineTwoListNode(ListNode node1, ListNode node2)
        {
            ListNode resultNode = new ListNode(0, null);  //初始化结果结点,把它的头部作为一个哑巴结点

            while (node1 != null && node2 != null)
            {
                if (node1.val <= node2.val)
                {
                    resultNode.next = new ListNode(node1.val, null);
                    node1 = node1.next;
                }
                else
                {
                    resultNode.next = new ListNode(node2.val, null);
                    node2 = node2.next;
                }

                resultNode = resultNode.next;
            }

            if (node1 != null)  //如果循环完,node1还有结点,就把它直接放在结果结点后面
                resultNode.next = node1;
            if (node2 != null) //如果循环完,node2还有结点,就把它直接放在结果结点后面
                resultNode.next = node2;

            return resultNode.next; //扣除掉初始化时的哑巴结点,就是我们需要的结果结点
            
        }

 

递归的写法我们也看看

public ListNode MergeTwoListNode(ListNode node1, ListNode node2)
        {
            if (node1 == null)
            {
                return node1;
            }
            else if (node2 == null)
            {
                return node2;
            }
            else if (node1.val < node2.val)
            {
                node1.next = MergeTwoListNode(node1.next, node2);
                return node1;
            }
            else
            {
                node2.next = MergeTwoListNode(node1, node2.next);
                return node2;
            }
        }

 

posted on 2023-12-15 09:55  新西兰程序员  阅读(2)  评论(0编辑  收藏  举报