如题
输入:(2->4->3) + (5->6->4)
输出:7->0->8
原因:342 + 465 = 807
代码如下
/**
* 定义一个单链表
*/
class ListNode {
public $val = 0;
public $next = null;
function __construct($val) {
$this->val = $val;
}
}
/**
* 实现两数相加
*
* @param ListNode $l1
* @param ListNode $l2
* @return ListNode
*/
function addTwoNumbers(ListNode $l1, ListNode $l2) {
$dummyHead = new ListNode(0);
$p = $l1;
$q = $l2;
$curr = $dummyHead;
$carry = 0;
while ($p != null || $q != null) {
$x = ($p != null) ? $p->val : 0;
$y = ($q != null) ? $q->val : 0;
$sum = $carry + $x + $y;
$carry = intval($sum / 10); // 按10进位
$curr->next = new ListNode($sum % 10);
$curr = $curr->next;
if ($p != null) $p = $p->next;
if ($q != null) $q = $q->next;
}
// 最后两数相加有进位处理
if ($carry > 0) {
$curr->next = new ListNode($carry);
}
return $dummyHead->next;
}
/**
* 链表转数组
*
* @param ListNode $data
* @return array
*/
function listToArray(ListNode $data)
{
$result = [];
while ($data != null) {
$result[] = $data->val;
$data = $data->next;
}
return $result;
}
/**
* 数组转链表
*
* @param array $data
* @return ListNode
*/
function arrayToList($data)
{
$result = new ListNode(0);
if (!empty($data)) {
$result = new ListNode(array_shift($data));
$current = $result;
foreach ($data as $val) {
$current->next = new ListNode($val);
$current = $current->next;
}
}
return $result;
}
$l1 = arrayToList([2, 4, 6]);
$l2 = arrayToList([5, 6, 4]);
var_dump(listToArray(addTwoNumbers($l1 , $l2)));