[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; } }