赞
踩
1、合并两个有序链表
给你链表的头结点 head
,请将其按 升序 排列并返回 排序后的链表 。
- class Solution {
- public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
- //定义一个头结点
- ListNode prehead = new ListNode(-1);
-
- //当前节点
- ListNode prev = prehead;
- while (l1 != null && l2 != null) {
- //当前节点指向值比较小的节点
- if (l1.val <= l2.val) {
- prev.next = l1;
- l1 = l1.next;
- } else {
- prev.next = l2;
- l2 = l2.next;
- }
- prev = prev.next;
- }
-
- // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
- prev.next = l1 == null ? l2 : l1;
-
- return prehead.next;
- }
- }

2、合并两个链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
- //使用归并排序实现链表的升序
- //时间复杂度 O(nlogn) 空间复杂度O(n)
- class Solution {
- public ListNode sortList(ListNode head) {
- return sortList(head, null);
- }
-
-
- public ListNode sortList(ListNode head, ListNode tail) {
- if (head == null) {
- return head;
- }
- if (head.next == tail) {
- head.next = null;
- return head;
- }
-
- //使用快慢指针,慢指针一次移动一个节点,快指针一次移动两个结点
- //最终 慢指针停在中点,快指针停在尾结点
- ListNode slow = head, fast = head;
- while (fast != tail) {
- slow = slow.next;
- fast = fast.next;
- if (fast != tail) {
- fast = fast.next;
- }
- }
- ListNode mid = slow;
- ListNode list1 = sortList(head, mid);
- ListNode list2 = sortList(mid, tail);
- ListNode sorted = merge(list1, list2);
- return sorted;
- }
-
- //合并两个有序数组
- public ListNode merge(ListNode head1, ListNode head2) {
- ListNode dummyHead = new ListNode(0);
- ListNode temp = dummyHead, temp1 = head1, temp2 = head2;
- while (temp1 != null && temp2 != null) {
- if (temp1.val <= temp2.val) {
- temp.next = temp1;
- temp1 = temp1.next;
- } else {
- temp.next = temp2;
- temp2 = temp2.next;
- }
- temp = temp.next;
- }
- if (temp1 != null) {
- temp.next = temp1;
- } else if (temp2 != null) {
- temp.next = temp2;
- }
- return dummyHead.next;
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。