剑指Offer16 - 合并两个排序的链表
2020-06-02 06:17
183 查看
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解题思路
递归和遍历两种思路:
- 我们合并时,我们用两个链表中值较小的头结点并把它连接到已经合并的链表之后,两个链表剩余的结点依然是排序的,因此合并的步骤和之前的步骤是一样的。这就是典型的递归的过程,可以定义递归函数来完成者以合并过程。
- 我们可以遍历两个有序链表,始终用较小值插入到我们目标链表上,直到某一根链表遍历完成。最后需要注意两个链表中可能仍有一个链表还有数据需要处理。
代码实现
import java.util.Scanner; public class Problem16 { public static class ListNode { int val; ListNode next; ListNode(int val) { this.val = val; } } public static ListNode Merge(ListNode l1,ListNode l2) { if (l1 == null) return l2; if (l2 == null) return l1; ListNode head = null; if (l1.val <= l2.val){ head = l1; head.next = Merge(l1.next, l2); } else { head = l2; head.next = Merge(l1, l2.next); } return head; } public static ListNode Merge1(ListNode l1,ListNode l2) { ListNode head = new ListNode(-1); head.next = null; ListNode root = head; while(l1 != null && l2 != null) { if(l1.val < l2.val){ head.next = l1; head = l1; l1 = l1.next; } else { head.next = l2; head = l2; l2 = l2.next; } } //如果有一个链表为空,另一个链表非空,则应该把非空链表合并到链表尾部。 if(l1 != null) { head.next = l1; } if(l2 != null) { head.next = l2; } return root.next; } public static void main(String[] args) { Scanner cin = new Scanner(System.in); } }
相关文章推荐
- 剑指Offer16:合并两个排序的链表
- 合并两个排序的链表
- 剑指offer——合并两个排序的链表
- 剑指offer--合并两个排序的链表
- 【newCoder】剑指Offer_编程题 合并两个排序的链表
- lintcode——合并两个排序链表
- 剑指offer(十五)之合并两个排序的链表
- C语言——合并两个递增排序链表
- 【剑指offer】合并两个排序的链表
- 剑指offer面试题17——合并两个排序的链表
- 剑指offer-16.合并两个排序的链表
- 面试题17 合并两个排序链表
- 九度OJ-题目1519:合并两个排序的链表
- (十六)合并两个排序的链表
- 剑指offer题解 合并两个排序的链表
- 合并两个排序链表
- 合并两个排序的链表
- 剑指Offer--面试题17:合并两个排序的链表--Java实现
- 合并两个排序链表
- 合并两个排序链表