leetcode 143 鏈表對折


 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 class Solution {
10     public void reorderList(ListNode head) {
11         ListNode p1 = head;
12         ListNode p2 = head;
13         while (p1 != null && p2 != null && p2.next != null) {
14             p1 = p1.next;
15             p2 = p2.next.next;
16         }
17         if (p1 != null) {
18             p2 = p1.next;
19             p1.next = null;
20         }
21         ListNode pre = reverseList(p2);
22         mergeLists(head, pre);
23     }
24     
25     public ListNode reverseList(ListNode p) {
26         if (p == null)
27             return p;
28         ListNode pre = p;
29         p = p.next;
30         pre.next = null;
31         while (p != null) {
32             ListNode tmp = p;
33             p = p.next;
34             tmp.next = pre;
35             pre = tmp;
36         }
37         return pre;
38     }
39     
40     public void mergeLists(ListNode head, ListNode pre) {
41         ListNode p1 = head;
42         ListNode p2 = pre;
43         ListNode tmp = null;
44         while (p1 != null && p2 != null) {
45             tmp = p1.next;
46             p1.next = p2;
47             p1 = tmp;
48             tmp = p2.next;
49             if (p1 == null) {
50                 break;
51             }
52             p2.next = p1;
53             p2 = tmp;
54         }
55     }
56 }

面試常考的一題,比較繁瑣。包含了鏈表中點,反轉鏈表,合並鏈表這三大常考的子問題。

代碼還不是最優的,后續會更新一個更清晰,簡練的版本。

End


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM