Skip to content

Commit c72ba03

Browse files
authored
增加排序链表
1 parent e032141 commit c72ba03

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

java/148.排序链表.java

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* @lc app=leetcode.cn id=148 lang=java
3+
*
4+
* [148] 排序链表
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* Definition for singly-linked list.
10+
* public class ListNode {
11+
* int val;
12+
* ListNode next;
13+
* ListNode() {}
14+
* ListNode(int val) { this.val = val; }
15+
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
16+
* }
17+
*/
18+
class Solution {
19+
public ListNode sortList(ListNode head) {
20+
return mergeSort(head);
21+
}
22+
23+
public ListNode findMiddle(ListNode node) {
24+
ListNode slow = node;
25+
ListNode fast = node.next;
26+
27+
while(fast != null && fast.next != null) {
28+
fast = fast.next.next;
29+
slow = slow.next;
30+
}
31+
32+
return slow;
33+
}
34+
35+
public ListNode mergeTwoLists(ListNode node1, ListNode node2) {
36+
ListNode dummy = new ListNode();
37+
ListNode head = dummy;
38+
39+
while(node1 != null && node2 != null) {
40+
if(node1.val < node2.val) {
41+
head.next = node1;
42+
node1 = node1.next;
43+
} else {
44+
head.next = node2;
45+
node2 = node2.next;
46+
}
47+
48+
head = head.next;
49+
}
50+
51+
if(node1 != null) {
52+
head.next = node1;
53+
}
54+
55+
if(node2 != null) {
56+
head.next = node2;
57+
}
58+
59+
return dummy.next;
60+
}
61+
62+
public ListNode mergeSort(ListNode node) {
63+
if(node == null || node.next == null) {
64+
return node;
65+
}
66+
67+
ListNode middleNode = findMiddle(node);
68+
ListNode middleNodeNext = middleNode.next;
69+
middleNode.next = null;
70+
71+
ListNode node1 = mergeSort(node);
72+
ListNode node2 = mergeSort(middleNodeNext);
73+
74+
return mergeTwoLists(node1, node2);
75+
}
76+
}
77+
// @lc code=end
78+

0 commit comments

Comments
 (0)